import requests
import time
import pandas as pd
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
import matplotlib.pyplot as plt
import seaborn as sns
from collections import Counter
sns.set_theme(style="whitegrid", font='SimHei', font_scale=1.1)
"""
爬取数据
"""
all_data = []
offset = 0 #分页偏移量
limit = 20

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Referer': 'https://www.hurun.net/zh-CN/Rank/HsRankDetails?pagetype=rich&num=ODBYW2BI',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
}

while True:
    url = f"https://www.hurun.net/zh-CN/Rank/HsRankDetailsList?num=ODBYW2BI&search=&offset={offset}&limit={limit}"
    print(f"正在抓取 offset={offset} ...")
    resp = requests.get(url, headers=headers, timeout=60)
    if resp.status_code == 200:
        #print(resp.text)
        result = resp.json()
        print(result)
        rows = result.get('rows', [])
        if not rows:
            break
        for row in rows:
            char_info = row.get('hs_Character', [{}])[0]
            all_data.append([
                row.get('hs_Rank_Rich_Ranking'),
                row.get('hs_Rank_Rich_Wealth'),
                row.get('hs_Rank_Rich_Ranking_Change'),
                row.get('hs_Rank_Rich_ChaName_Cn'),
                row.get('hs_Rank_Rich_ComName_Cn'),
                row.get('hs_Rank_Rich_Industry_Cn'),
                char_info.get('hs_Character_Gender'),
                char_info.get('hs_Character_Age'),
                char_info.get('hs_Character_NativePlace_Cn'),
                char_info.get('hs_Character_Permanent_Cn')
            ])
        offset += limit
        time.sleep(1)

columns = ['排名', '财富（亿）', '排名变化', '姓名', '企业', '行业', '性别', '年龄', '出生地', '常住地']
df = pd.DataFrame(all_data, columns=columns)
df.to_csv('hurun_2024.csv', index=False, encoding='utf-8-sig')
print('数据已保存为hurun_2024.csv')

"""
数据处理
"""
# 读取数据
csv_file = 'hurun_2024.csv'
df = pd.read_csv(csv_file)

# 行业拆分展开，每个人的财富计入其所有行业
industry_col = '行业'
wealth_col = '财富（亿）'

# 生成“人-行业”展开表
rows = []
for _, row in df.iterrows():
    industries = str(row[industry_col]).split('、')
    for ind in industries:
        rows.append({
            '姓名': row['姓名'],
            '行业': ind,
            '财富（亿）': row[wealth_col]
        })
df_industry_expanded = pd.DataFrame(rows)

# 统计
industry_stats = df_industry_expanded.groupby('行业')['财富（亿）'].agg(['count', 'sum']).sort_values('count', ascending=False)
print('\n各行业富豪数量和总财富（前10行）：')
pd.set_option('display.max_rows', None)
print(industry_stats)

# ====== 简单行业发展态势分析 ======
print('\n' + '='*40)
print('行业发展态势分析')
print('='*40)

# 1. 行业集中度分析
total_wealth = industry_stats['sum'].sum()
total_people = industry_stats['count'].sum()

print(f'\n1. 行业集中度分析:')
print(f'总财富: {total_wealth:.0f}亿元')
print(f'总富豪人数: {total_people}人')

# 计算各行业占比
industry_stats['财富占比(%)'] = (industry_stats['sum'] / total_wealth * 100).round(2)
industry_stats['人数占比(%)'] = (industry_stats['count'] / total_people * 100).round(2)
industry_stats['人均财富(亿)'] = (industry_stats['sum'] / industry_stats['count']).round(2)

print(f'\n前5大行业财富集中度:')
top5_wealth_share = industry_stats['财富占比(%)'].head(5).sum()
print(f'前5大行业财富占比: {top5_wealth_share:.1f}%')

print(f'\n前5大行业人数集中度:')
top5_people_share = industry_stats['人数占比(%)'].head(5).sum()
print(f'前5大行业人数占比: {top5_people_share:.1f}%')

# 2. 行业效率分析
print(f'\n2. 行业效率分析 (人均财富排名前10):')
efficiency_ranking = industry_stats.sort_values('人均财富(亿)', ascending=False)
print(efficiency_ranking[['count', 'sum', '人均财富(亿)', '财富占比(%)']].head(10))

# 3. 行业发展趋势总结
print(f'\n3. 行业发展趋势总结:')
print(f'• 财富最集中的行业: {industry_stats.index[0]} (占比{industry_stats.iloc[0]["财富占比(%)"]:.1f}%)')
print(f'• 人数最多的行业: {industry_stats.index[0]} ({industry_stats.iloc[0]["count"]}人)')
print(f'• 人均财富最高的行业: {efficiency_ranking.index[0]} ({efficiency_ranking.iloc[0]["人均财富(亿)"]:.1f}亿元/人)')

print('\n' + '='*40)
print('行业分析完成')
print('='*40)

# ====== 简单可视化 ======


# 行业效率对比散点图
plt.figure(figsize=(10,8))
plt.scatter(industry_stats['count'], industry_stats['人均财富(亿)'],
           s=industry_stats['财富占比(%)']*30, alpha=0.7, c=industry_stats['sum'], cmap='viridis')
plt.colorbar(label='总财富（亿元）')

# 标注前5大行业
for i, (industry, row) in enumerate(industry_stats.head(5).iterrows()):
    plt.annotate(industry, (row['count'], row['人均财富(亿)']),
                xytext=(5, 5), textcoords='offset points', fontsize=9, fontweight='bold')

plt.xlabel('富豪人数')
plt.ylabel('人均财富（亿元）')
plt.title('行业规模与效率对比分析')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('industry_efficiency_scatter.png')
plt.show()
plt.close()

print('行业发展态势分析图表已生成完成！')

# 柱状图：各行业富豪数量Top10
plt.figure(figsize=(12,6))
ax = sns.barplot(
    x=industry_stats['count'].head(10).index,
    y=industry_stats['count'].head(10).values,
    hue=industry_stats['count'].head(10).index,
    palette='Blues_d',
    legend=False
)
plt.title('各行业富豪数量Top10')
plt.ylabel('富豪数量')
plt.xlabel('行业')
plt.xticks(rotation=30, ha='right')
for i, v in enumerate(industry_stats['count'].head(10).values):
    ax.text(i, v + 1, str(v), ha='center', va='bottom', fontsize=10)
plt.tight_layout()
plt.savefig('industry_count_top10.png')
plt.show()
plt.close()

# 柱状图：各行业总财富Top10
plt.figure(figsize=(12,6))
ax = sns.barplot(
    x=industry_stats['sum'].head(10).index,
    y=industry_stats['sum'].head(10).values,
    hue=industry_stats['sum'].head(10).index,
    palette='Oranges',
    legend=False
)
plt.title('各行业总财富Top10')
plt.ylabel('总财富（亿）')
plt.xlabel('行业')
plt.xticks(rotation=30, ha='right')
for i, v in enumerate(industry_stats['sum'].head(10).values):
    ax.text(i, v + 1, f'{v:.0f}', ha='center', va='bottom', fontsize=10)
plt.tight_layout()
plt.savefig('industry_wealth_top10.png')
plt.show()
plt.close()

#年龄分布
plt.figure(figsize=(10,6))
age_numeric = pd.to_numeric(df['年龄'], errors='coerce')
sns.histplot(age_numeric.dropna().astype(int), bins=20, kde=True, color='skyblue')
plt.title('富豪年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')
plt.tight_layout()
plt.savefig('age_distribution.png')
plt.show()
plt.close()

#性别分布
plt.figure(figsize=(7,7))
gender_counts = df['性别'].value_counts()
# 只保留男女，过滤掉未知性别
gender_counts_filtered = gender_counts[gender_counts.index.isin(['先生', '女士'])]

# 检查是否有男女数据
if len(gender_counts_filtered) > 0:
    colors = sns.color_palette('pastel')[0:len(gender_counts_filtered)]
    gender_counts_filtered.plot.pie(autopct='%.1f%%', startangle=90, counterclock=False, shadow=True, colors=colors,pctdistance=0.7,textprops={'fontsize': 10,'weight': 'bold'})
    plt.title('富豪性别分布')
    plt.ylabel('')
    plt.tight_layout()
    plt.savefig('gender_pie.png')
    plt.show()
    plt.close()
else:
    print("没有找到男女的性别数据")
    plt.close()

#出生地/常住地分布
locations = df['出生地'].dropna().tolist() + df['常住地'].dropna().tolist()
location_counts = Counter(locations)
loc_df = pd.DataFrame(location_counts.items(), columns=['地区', '数量']).sort_values('数量', ascending=False).head(20)
print(loc_df)
plt.figure(figsize=(14,7))
ax = sns.barplot(
    x='地区',
    y='数量',
    hue='地区',
    data=loc_df,
    palette='viridis',
    legend=False
)
plt.title('富豪出生地/常住地Top20')
plt.ylabel('人数')
plt.xlabel('地区')
plt.xticks(rotation=45, ha='right')
for i, v in enumerate(loc_df['数量']):
    ax.text(i, v + 1, str(v), ha='center', va='bottom', fontsize=9)
plt.tight_layout()
plt.savefig('location_top20.png')
plt.show()
plt.close()

print('统计与可视化分析已完成，图片已保存。')